package com.wooboo.server.ext.action.phone;

import java.util.Date;

import com.wooboo.dsp.redis.util.RedisClient;
import com.wooboo.server.ext.ActionBase;
import com.wooboo.server.ext.ApiError;
import com.wooboo.server.ext.Logger;
import com.wooboo.server.ext.Result;
import com.wooboo.server.ext.data.VerificationCode;
import com.wooboo.server.ext.service.DbService;
import com.wooboo.server.ext.util.DateUtil;
import com.wooboo.server.ext.util.Parameters;
import com.wooboo.server.ext.util.StringUtil;

import net.sf.json.JSONObject;



public class Code extends ActionBase{

	public Logger logger = Logger.getLogger(Code.class);
	public String phone_number;
	public String vcode_key="vcode_";
	/**
  　 *移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
	 *联通：130、131、132、152、155、156、185、186
	 *电信：133、153、180、189、（1349卫通）
	 */
	@Override
	public void initParameters(Parameters params) throws ApiError {
         phone_number = params.getFieldValue("phone_number");
         //if(StringUtil.isEmpty(phone_number)||!phone_number.matches("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$")){
         if(StringUtil.isEmpty(phone_number)||!phone_number.matches("^((13[0-9])|(14[0-9])|(15[^4,\\D])|(17[0-9])|(18[0-9]))\\d{8}$")){
        	 throw ApiError.Type.INVALID_PARAM.toException("不正确的手机号码!"); 
         }
         JSONObject vcode = findCode(vcode_key+phone_number);//XMemcachedUtil.getInstance().get(ApiCache.vcode_key+phone_number, VerificationCode.class);
         if(null!=vcode){
        	Date send_time =new Date(vcode.getLong("send_time"));
            long a =DateUtil.getSecondByTwoDate(send_time, new Date());       	 
            if(a<60){
            	logger.info("distance from the last transmission [%d] seconds", a);
                throw ApiError.Type.INVALID_PARAM.toException("短信发送太频繁!");
            }
         }
	}

	@Override
	public Result invokeService() throws ApiError {
		Result result = new Result();
		DbService dbService = new DbService();
		Integer sendtimes = dbService.sendTimes(phone_number, new Date());
		if(sendtimes>20){
			throw ApiError.Type.INTERNAL_ERROR.toException("单日发送次数达到上限!");
		}
		VerificationCode vcode = new VerificationCode();
		vcode.phone_number=phone_number;
		vcode.send_time=new Date();
		vcode.verification_code=StringUtil.createId(4);
		dbService.saveVerification(vcode);
		
		//发送短信
		//MessagePusher.getInstance().sendSms(phone_number, "验证码"+vcode.verification_code+",请勿向任何人泄露，验证码提供他人将导致账户被盗,请勿转发(30分钟内有效).");

		
		
		//加入缓存
		JSONObject cache = new JSONObject();
		cache.put("code", vcode.verification_code);
		cache.put("send_time",vcode.getSend_time().getTime());
		RedisClient.getRedisClient().setex(vcode_key+phone_number, 60, cache.toString());
		
		
		
		JSONObject data = new JSONObject();
		data.put("phone_msg", "验证码"+vcode.verification_code+",请勿向任何人泄露,验证码20分钟有效,请勿转发.");
		data.put("vcode", vcode.verification_code);
		result.put("data", data);
		return result;
	}
	
	
	public JSONObject findCode(String key){
		String codeJson = RedisClient.getRedisClient().get(key);
		if(null!=codeJson){
			return JSONObject.fromObject(codeJson);
		}
		return null;
	}
	

}
